package com.yp.lession.redisqf211.service.impl;


import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sun.xml.internal.bind.v2.runtime.reflect.Lister;
import com.yp.lession.redisqf211.cont.Const;
import com.yp.lession.redisqf211.dao.EmpMapper;
import com.yp.lession.redisqf211.entity.Emp;
import com.yp.lession.redisqf211.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import sun.java2d.pipe.SpanIterator;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author cos
 * @since 2022-03-24
 */
@Service
public class EmpServiceImpl extends ServiceImpl<EmpMapper, Emp> implements EmpService {
    @Resource
    private EmpMapper empMapper;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    private ObjectMapper om = new ObjectMapper();

    @Override
    public List<Emp> getList() throws JsonProcessingException {
        List<Emp> empList = new ArrayList<>();
        //1直接访问redis获取缓存数据
        String emp_list = stringRedisTemplate.boundValueOps(Const.EMP_LIST_CACHE).get();
        //2判断数据是否存在
        if (emp_list!=null) {
            System.out.println("已缓存");
            //有值 转list集合返回出去
            empList = om.readValue(emp_list, new TypeReference<List<Emp>>() {});
        }else {
            System.out.println("无缓存");
            //3如果不存在就访问数据库
            empList = empMapper.selectList(null);
            //4从数据库那到数据存到redis  把集合转为json数据保存redis数据库 作为缓存数据使用
            String value = om.writeValueAsString(empList);
            stringRedisTemplate.boundValueOps(Const.EMP_LIST_CACHE).set(value);

        }

        return empList;
    }

    @Override
    public Emp empById(Integer eno) throws JsonProcessingException {
        Emp emp = null;
        // 1 直接访问redis 获得数据
        String emp_string = (String) stringRedisTemplate.boundHashOps(Const.EMP_CACHE).get(eno.toString());
        // 2 判断数据是否存在
        if (emp_string != null) {
            System.out.println("有缓存");
            // 3 如果存在直接返回
            emp = om.readValue(emp_string,Emp.class);
        }else {
            System.out.println("没有缓存");
            // 4 如果不存在就查询数据库 保持到redis
            emp = empMapper.selectById(eno);
            if (emp != null) {
                String value = om.writeValueAsString(emp);
                stringRedisTemplate.boundHashOps(Const.EMP_CACHE).put(eno.toString(),value);
            }
        }
        return emp;
    }

    @Override
    public boolean updateEmp(Emp emp) {
        // 1 完成修改业务
        int i = empMapper.updateById(emp);
        if (i>0) {
            System.out.println("修改成功");
            //2清除缓存
            //2.1 清楚所有list缓存
            stringRedisTemplate.delete(Const.EMP_LIST_CACHE);
            //2.2 通过员工eno查单个员工数据的缓存,  存在清楚  不存在不管
            Boolean ans = stringRedisTemplate.boundHashOps(Const.EMP_CACHE).
                    hasKey(emp.getEno().toString());
            System.out.println("清空list缓存成功");
            if (ans) {
                stringRedisTemplate.boundHashOps(Const.EMP_CACHE).
                        delete(emp.getEno().toString());
                System.out.println("清空"+emp.getEno()+"数据成功");
            }
            return true;
        }
        System.out.println("修改失败");
        return false;
    }


}
